    /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package objetos.personajes;

import objetos.Arma;
import java.util.ArrayList;

/**
 *
 * @author cvasquez
 */
public abstract class Personaje {

    private int vidaMaxima;
    private int vidaActual;
    private int costo;
    private int manutencion;
    private ArrayList<Arma> armasAtaque;
    private Arma armaDefensa = null;
    private int ataquePropio;
    private int defensaPropia;
    private int tipoPersonaje;
    //Atributos agregados para funcionar con hilos
    private int x;
    private int y;

    public int dirAnt =9;

    private int bando; //0: Patriota / 1: Realista
    private int tiempoAparicion;
    private boolean seleccionado = false;
    private boolean atacado;
    private boolean tieneHilo = false;
    //Estos atributo se manejan solo para la jugabilidad artificial
    public static int DireccionArtificial;
    private int comprasEnEsaAldea = 0;
    private int direccionCompra = 1;
    private int contador = 0;


    //	<editor-fold defaultstate="collapsed" desc="Constructores">
    public Personaje() {
    }

    public Personaje(int vidaMaxima, int vidaActual, int costo, int manutencion, ArrayList<Arma> armasAtaque, Arma armaDefensa, int ataquePropio, int defensaPropia, int tipoPersonaje, int tiempoAparicion) {
        this.vidaMaxima = vidaMaxima;
        this.vidaActual = vidaActual;
        this.costo = costo;
        this.manutencion = manutencion;
        this.armasAtaque = armasAtaque;
        this.armaDefensa = armaDefensa;
        this.ataquePropio = ataquePropio;
        this.defensaPropia = defensaPropia;
        this.tipoPersonaje = tipoPersonaje;
        this.tiempoAparicion = tiempoAparicion;
    }
    //	</editor-fold>

    //	<editor-fold defaultstate="collapsed" desc="Getters & Setters">
    public Arma getArmaDefensa() {
        return armaDefensa;
    }

    public void setArmaDefensa(Arma armaDefensa) {
        //Valida si ese tipo de arma puede ser usada por este tipo de personaje
        //    if ( (tipoPersonaje == armaDefensa.getTipoArmaxPersonaje()) && (armaDefensa.getTipo() == 0) ) {
        this.armaDefensa = armaDefensa;
        //    }
    }

    public ArrayList<Arma> getArmasAtaque() {
        return armasAtaque;
    }

    public void setArmaAtaque(Arma armaAtaque) {
        //Valida si ese tipo de arma puede ser usada por este tipo de personaje
        if ((tipoPersonaje == armaAtaque.getTipoArmaxPersonaje()) && (armaAtaque.getTipo() == 1)) {
            if (armasAtaque == null) {
                armasAtaque = new ArrayList<Arma>();
            }
            //Si el combatiente no excede aún su cantidad máxima de armas de ataque
            if (armasAtaque.size()<2) {
                armasAtaque.add(armaAtaque);
            }
        }
    }

    public void setArmasAtaque(ArrayList<Arma> armasAtaque) {
        this.armasAtaque = armasAtaque;
    }

    public int getAtaquePropio() {
        return ataquePropio;
    }

    public void setAtaquePropio(int ataquePropio) {
        this.ataquePropio = ataquePropio;
    }

    public int getCosto() {
        return costo;
    }

    public void setCosto(int costo) {
        this.costo = costo;
    }

    public int getDefensaPropia() {
        return defensaPropia;
    }

    public void setDefensaPropia(int defensaPropia) {
        this.defensaPropia = defensaPropia;
    }

    public int getManutencion() {
        return manutencion;
    }

    public void setManutencion(int manutencion) {
        this.manutencion = manutencion;
    }

    public int getVidaActual() {
        return vidaActual;
    }

    public void setVidaActual(int vidaActual) {
        this.vidaActual = vidaActual;
    }

    public int getVidaMaxima() {
        return vidaMaxima;
    }

    public void setVidaMaxima(int vidaMaxima) {
        this.vidaMaxima = vidaMaxima;
    }

    public int getTipoPersonaje() {
        return tipoPersonaje;
    }

    public void setTipoPersonaje(int tipoPersonaje) {
        this.tipoPersonaje = tipoPersonaje;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getTiempoAparicion() {
        return tiempoAparicion;
    }

    public void setTiempoAparicion(int tiempoAparicion) {
        this.tiempoAparicion = tiempoAparicion;
    }

    public static int getDireccionArtificial() {
        return DireccionArtificial;
    }

    public int getComprasEnEsaAldea() {
        return comprasEnEsaAldea;
    }

    public void setComprasEnEsaAldea(int comprasEnEsaAldea) {
        this.comprasEnEsaAldea = comprasEnEsaAldea;
    }

    public int getDireccionCompra() {
        return direccionCompra;
    }

    public void setDireccionCompra(int direccionCompra) {
        this.direccionCompra = direccionCompra;
    }

    public boolean isAtacado() {
        return atacado;
    }

    public void setAtacado(boolean atacado) {
        this.atacado = atacado;
    }

    public int getBando() {
        return bando;
    }

    public void setBando(int bando) {
        this.bando = bando;
    }

    public boolean isSeleccionado() {
        return seleccionado;
    }

    public void setSeleccionado(boolean seleccionado) {
        this.seleccionado = seleccionado;
    }

    public boolean isTieneHilo() {
        return tieneHilo;
    }

    public void setTieneHilo(boolean tieneHilo) {
        this.tieneHilo = tieneHilo;
    }




    //	</editor-fold>

    //	<editor-fold defaultstate="collapsed" desc="Métodos de jugabilidad">
    /**
     * Aumenta la vida del personaje con la cantidad pasada como parámetro
     * siempre y cuando sea posible, es decir no exceda su vida máxima.
     * @param aumento Cantidad de vida a aumentar.
     */
    public void aumentarVida(int aumento) {
        if ((vidaActual + aumento) < vidaMaxima) {
            vidaActual += aumento;
        }
    }

    /**
     * Devuelve la cantidad de armas del tipo consultado que pueden ser asignadas
     * a ese combatiente. Recibe como parmatros 1(ataque) o 0(defensa)
     * @param tipoArma Si el arma es de ataque o de defensa
     * @return La cantidad de armas de ese tipo que se le pueden asignar a ese combatiente
     */
    public int getArmasPosibles(int tipoArma) {
        //tipoArma: 1 (Ataque) /  0 (Defensa)
        if (tipoArma == 0) {
            if (armaDefensa == null) {
                return 1;
            }
            else {
                return 0;
            }
        }
        if (tipoArma == 1) {
            if (armasAtaque == null || armasAtaque.isEmpty()) {
                return 2;
            }
            if (armasAtaque.size() == 1) {
                return 1;
            }
            else {
                return 0;
            }
        }
        //Por seguridad, si se envió un tipo de arma que no existe retorna 0
        else return 0;
    }
    //	</editor-fold>

    //	<editor-fold defaultstate="collapsed" desc="Métodos para funcionar con hilos">
    public static void actualizaDireccionArtificial() {
        if (DireccionArtificial < 4)
            DireccionArtificial++;
        else
            DireccionArtificial = 1;
    }

    /**
     * Para que empiece desde 0 las compras en otra aldea a la que
     * se empezará a dirigir.
     */
    public int cambiaComprasEnEsaAldea() {
        if (comprasEnEsaAldea == 2) comprasEnEsaAldea = 0;
            else this.comprasEnEsaAldea++;
        return comprasEnEsaAldea;
    }

    public void cambiaDireccionCompra() {
        direccionCompra = DireccionArtificial;
        //Metodologia antigua de inteligencia artificial
        //if (direccionCompra == 4) direccionCompra = 1;
        //    else this.direccionCompra++;
    }

    /**
     * Devuelve el ataque total del combatiente en base a su ataque propio
     * y el de sus armas.
     * @return
     */
    public int ataqueTotal() {
        int ataqueTotal = ataquePropio;
        if (armasAtaque != null) {
            if (armasAtaque.size()==1)
                return ataqueTotal+armasAtaque.get(0).getIntensidad();
            else if (armasAtaque.size()==2)
                return ataqueTotal+armasAtaque.get(0).getIntensidad()+armasAtaque.get(1).getIntensidad();
            return ataqueTotal;
        }
        return ataqueTotal;
    }

    /**
     * Devuelve la defensa total del combatiente en base a su defensa propia
     * y la de sus armas.
     * @return
     */
    public int defensaTotal() {
        int defensaTotal = defensaPropia;
        if (armaDefensa != null)
            return defensaTotal += armaDefensa.getIntensidad();
        return defensaTotal;
    }

    /**
     * Disminuye la vida del personaje con la cantidad pasada como parámetro.
     * @param disminucion Cantidad de vida a disminuir.
     */
    public void disminuyeVida(int disminucion) {
            vidaActual -= disminucion;

    }
    //	</editor-fold>


    
}
